package com.zbbz.util.mybatis.buff;

import lombok.Data;

import java.io.Serializable;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * @author WangYang
 * @date 2025/02/25/14:20
 */
// 泛型T和R，一个是原始表实体类，一个是目标表实体类
@Data   // 省略getset方法
public class RelationConfig<T, R> {
    // 一对一 或 一对多
    private RelationType relationType;

    // 使用哪个字段作为主表的关联字段
    //    Function函数式编程，需要目标为T类型(原始表实体类)，返回值为Serializable
    //    对类型为T的对象应用操作，并返回结果。结果是Serializable类型的对象
    //    类似重写：Serializable apply(T t)
    private Function<T, Serializable> sourceId;

    // 使用哪个字段作为主表的注入字段
    //    BiConsumer函数式编程，接收两个对象但是没有返回
    //    类似于：T.setZbbzTest(T)
    private BiConsumer<T, R> sourceSetter;
    // 一对多数据注入方法
    private BiConsumer<T, List<R>> sourceListSetter;


    // 副表查询返回
    //    Function函数式编程，需要目标为Serializable类型，返回值为R
    //    类似于：id -> zbbzTestService.getById(id)
    private Function<Serializable, R> targetLoader;
    // 一对多数据加载器
    private Function<Serializable, List<R>> targetListLoader;
}
